import store from '@/store'
import router from '@/router'
// 1 .通用接口模块
import axios from 'axios'

// 2. 接口调用基准路径, 创建实例
const baseURL = 'https://apipc-xiaotuxian-front.itheima.net/'
const instance = axios.create({
  baseURL: baseURL
})

// 请求拦截器:统一添加请求头token
instance.interceptors.request.use(config => {
  // 统一添加请求头token（token存在时添加）
  const token = store.state.user.profile.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`// 如果有token, 添加进请求头
  }
  return config
}, err => {
  return Promise.reject(err)
})

// 响应拦截器
instance.interceptors.response.use(res => {
  // 处理返回的数据:去掉一层data属性
  return res.data
}, err => {
  // 处理token失效的情况：失效后跳转到登录页面
  if (err.response && err.response.status === 401) {
    // token失效了，跳转到登录页面
    router.push('/login')
  }
  return Promise.reject(err)
})

// 3. 导出并封装动态请求方式跟传参键名

// 第一种方式**********
// export default (url, method, data) => {
//   const config = {}
//   if (method === 'get') { // 如果请求方式是  get
//     config.params = data // 则 params方式
//   } else {
//     config.data = data // 否则是data     (也就是不管什么方式, 都传data)
//   }

//   return instance({
//     method: method || 'get', // 如果写请求方式, 则默认get
//     url: url,
//     ...config
//   })
// }
// 方式不同, 调用时传的也也不同,,一个时一一对应传参, 一个是传一个对象

// 老师的方式********
export default (options) => {
  let key = null
  if (options.method) { // 如果 method请求方式写了
    if (options.method.toUpperCase() === 'GET') { // 如果 method请求方式是get (不区分大小写)
      key = 'params'
    } else {
      key = 'data'
    }
  } else { // 如果method没写
    key = 'params' // 默认params
  }

  return instance({
    method: options.method || 'get', // 如果写请求方式, 则默认get
    url: options.url,
    [key]: options.data
  })
}
